Open Union
拡張可能(Open)な、Union型
a type-indexed coproduct of functors
と、『Extensible Effects An Alternative to Monad Transformers』に書いてた
open-union
https://hackage.haskell.org/package/open-union
https://qiita.com/nwtgck/items/03e0817ceda5c4b60957
Open Unionを便利に扱うpackage
ExistentialQuantificationなどを有効にすれば扱える
特にpackageが必要というわけでもない
https://qiita.com/YoshikuniJujo/items/8dd63c9415ccda20be28
拡張可能な、Union型である
だから、OpenなUnion
普通にHeterogenous collectionsを作るにはこういう型を定義しておけばいい
code:hs
data Value
= Unit ()
| Bool Bool
| Integer Integer
| Char Char
そうすれば[Value]とすることで、複数の型を含んだリストを作ることができる
しかし、これはあとから拡張ができない
いわばClosed Unionであるmrsekut.icon
存在型を使うことで、あとから拡張可能なHeterogenous collectionsを作ることができる
code:hs
data UnionValue = forall x . UnionValue x
このUnionValue型は、UnionであるValue型を拡張可能にしたものと見なせる
code:hs
value :: UnionValue
value = [ UnionValue (123 :: Integer)
, UnionValue True
, UnionValue ()
, UnionValue 'c'
]
value' :: UnionValue
value' = value ++ UnionValue (123 :: Double)
存在型の定義の仕方を工夫すれば、「MonadのみのOpen Union」なども定義できる
https://qiita.com/YoshikuniJujo/items/3e7adbbbf0e7f73f669f
いくつかのGHC拡張を使うことで、拡張可能な型レベルリストを構成できる
code:hs
data UnionValue (as :: *) = forall a . UnionValue Word a
type A = UnionValue 'Int, Bool
type B = UnionValue 'Int, Bool, String
AからBへの変化を見れば分かる通り、これもOpen Unionである
https://blog.ryota-ka.me/posts/2020/12/20/composable-error-with-quantified-open-union
UseCase層にて、Repository層の関数が返す複数種類のエラーを扱うためにOpen Unionを用いている
Trees that Growとの関係 #??